#include <swap.h>
#include <swapfs.h>
#include <mmu.h>
#include <fs.h>
#include <ide.h>
#include <pmm.h>
#include <assert.h>

/**
 * swapfs_init函数用于初始化交换文件系统。
 * 该函数主要进行以下工作：
 * 1. 使用静态断言确保页面大小（PGSIZE）是扇区大小（SECTSIZE）的倍数，
 *    这是为了保证在交换分区上进行页面交换时不会跨越扇区边界，确保数据的一致性和效率。
 * 2. 检查指定的交换设备（SWAP_DEV_NO）是否有效，如果无效，则触发panic
 *    并提示交换文件系统不可用，这确保了系统在不合适的配置下不会继续运行，避免了潜在的错误。
 * 3. 计算并设置交换分区上可用于交换的最大偏移量（max_swap_offset），
 *    这是通过将交换设备的大小除以每个页面对应的扇区数得到的，它限制了交换分区的使用范围。
 */
void
swapfs_init(void) {
    // 确保页面大小是扇区大小的倍数，以保证数据对齐
    static_assert((PGSIZE % SECTSIZE) == 0);

    // 检查交换设备是否有效，确保交换功能可以使用
    if (!ide_device_valid(SWAP_DEV_NO)) {
        panic("swap fs isn't available.\n");
    }
    // 计算交换分区上可用于交换的最大偏移量
    max_swap_offset = ide_device_size(SWAP_DEV_NO) / (PGSIZE / SECTSIZE);
}

//entry：表示要读取的交换条目。page：指向要填充的内存页的指针。
//函数返回 ide_read_secs 的结果，表示读取操作是否成功
//计算交换条目的偏移量 swap_offset(entry)。
//使用 ide_read_secs 函数从交换设备 SWAP_DEV_NO 中读取指定数量的扇区（PAGE_NSECT）到内存页 page2kva(page) 中。
int
swapfs_read(swap_entry_t entry, struct Page *page) {
    return ide_read_secs(SWAP_DEV_NO, swap_offset(entry) * PAGE_NSECT, page2kva(page), PAGE_NSECT);
}

int
swapfs_write(swap_entry_t entry, struct Page *page) {
    return ide_write_secs(SWAP_DEV_NO, swap_offset(entry) * PAGE_NSECT, page2kva(page), PAGE_NSECT);
}

